package com.tbit.common.utils;

import java.nio.charset.StandardCharsets;

/**
 * 检查utf8mb4字符
 *
 * @author <a href="mailto:chen.wutian@tbit.com.cn">BUGTian</a>
 * @since 2024/7/10
 */
public class Utf8Mb4Checker {

    /**
     * 检查字符串中是否包含UTF-8MB4编码的字符。
     * UTF-8MB4是UTF-8的一种变体，支持存储最大长度为4字节的Unicode字符。
     * 此方法主要用于判断给定字符串中是否存在需要这种扩展编码的字符。
     *
     * @param str 待检查的字符串
     * @return 如果字符串中包含UTF-8MB4扩展编码的字符，则返回true；否则返回false。
     */
    public static boolean containsUtf8mb4Chars(String str) {
        if (str == null) {
            return false;
        }
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        for (int i = 0; i < bytes.length - 3; i++) {
            // 检查当前字节是否是4字节编码的开始
            if ((bytes[i] & 0xF0) == 0xF0) {
                // 检查接下来的3个字节是否都是10开头
                if ((bytes[i + 1] & 0xC0) == 0x80 &&
                    (bytes[i + 2] & 0xC0) == 0x80 &&
                    (bytes[i + 3] & 0xC0) == 0x80) {
                    return true;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        String testString = "自己𠄘担全"; // 这里是一个emoji表情
        if (containsUtf8mb4Chars(testString)) {
            System.out.println("The string contains UTF-8 MB4 characters.");
        } else {
            System.out.println("The string does not contain UTF-8 MB4 characters.");
        }
    }
}